package vethbr

import (
	"bufio"
	"errors"
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"

	"gitee.com/chuanjinge/go-container/config"
	"gitee.com/chuanjinge/go-container/pkg/dirfile"
)

var ipamConfigPath string
var netLinkConfigPath string

const NET_SUBNET_IP_RECORD = "ipam.config"   // IP分配记录
const NET_SUBNET_NET_LINK = "netlink.config" // 所有创建好的网络链路

func getNetworkDir() string {
	// 先看目录是否存在，不存在的话，递归创建
	if err := dirfile.EnsureDirExists(config.GlobalConfig().NetworkDir); err != nil {
		return ""
	}
	return config.GlobalConfig().NetworkDir
}

func initNetLinkConfig() error {
	netLinkDir := getNetworkDir()
	if netLinkDir == "" {
		log.Println("无法创建network工作目录")
		return errors.New("无法初始化network目录")
	}
	// 如果文件不存在则创建该文件，存在的话直接返回
	// 判断文件是否存在
	netLinkConfigPath = filepath.Join(netLinkDir, NET_SUBNET_NET_LINK)
	if _, err := os.Stat(netLinkConfigPath); os.IsNotExist(err) {
		// 文件不存在，创建文件
		netLinkConfig, err := os.Create(netLinkConfigPath)
		log.Printf("IPAM文件 %s 已创建\n", netLinkConfigPath)
		if err != nil {
			log.Printf("操作IPAM配置文件时出错: %v\n", err)
			return errors.New("")
		}
		defer netLinkConfig.Close()
	}
	return nil
}

func initIPAMConfig() error {
	containerNetworkDir := getNetworkDir()
	// 先看目录是否存在，不存在的话，递归创建
	if containerNetworkDir == "" {
		log.Println("无法创建network工作目录")
		return errors.New("无法初始化network目录")
	}
	ipamConfigPath = filepath.Join(containerNetworkDir, NET_SUBNET_IP_RECORD)
	// 如果文件不存在则创建该文件，存在的话直接返回
	// 判断文件是否存在
	if _, err := os.Stat(ipamConfigPath); os.IsNotExist(err) {
		// 文件不存在，创建文件
		ipamConfig, err := os.Create(ipamConfigPath)
		log.Printf("IPAM文件 %s 已创建\n", ipamConfigPath)
		if err != nil {
			log.Printf("操作IPAM配置文件时出错: %v\n", err)
			return errors.New("")
		}
		defer ipamConfig.Close()
	}
	return nil
}

func readIPAMConfig() ([]byte, error) {
	file, err := os.Open(ipamConfigPath)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	subnetJson, err := io.ReadAll(reader)
	if err != nil {
		return nil, fmt.Errorf("failed to read IPAM config: %w", err)
	}

	return subnetJson, nil
}

func dump(configByte []byte) error {
	file, err := os.OpenFile(ipamConfigPath, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		return err
	}

	_, err = file.Write(configByte)
	return err
}
